package com.coocaa.ops.admin.base.service;


import com.coocaa.ops.admin.base.validator.NewAddOrEditValidator;
import com.coocaa.ops.common.core.base.entity.BaseOriginTableEntity;

/**
 * @author bijiahao
 * @date : 2018/8/9.
 * @description
 */
public abstract class BaseSaveServiceImpl<T extends BaseOriginTableEntity> implements ISaveService<T> {

    /**
     * 保存数据
     *
     * @param autoIncrementId
     * @param inputEntity
     * @param userId
     * @return
     */
    @Override
    public T saveBaseInfo(Integer autoIncrementId, T inputEntity, Integer userId) {
        /**
         *    副本版本置空-避免预览数据设置的值影响
         *    @see com.coocaa.fire.tvos.admin.biz.AbstractBizImpl#getEntityByIdAndVersion
         */
        inputEntity.setDuplicateVersion(null);
        if (NewAddOrEditValidator.isNewAdd(autoIncrementId, inputEntity.getCurrentVersion())) {
            //处理-新增
            this.handleNewAdd(inputEntity, userId);
        } else if (NewAddOrEditValidator.isCreateCopy(autoIncrementId, inputEntity.getCurrentVersion())) {
            //历史版本初始化-如果没有初始版本
            this.handleInitHistoryVersionData(autoIncrementId, userId);
            //处理-创建副本
            this.handleCreateCopy(inputEntity, userId);
        } else {
            //处理当前编辑-副本编辑
            this.handleCurrentEditAndCopyEdit(autoIncrementId, inputEntity, userId);
        }
        //处理-关联信息的保存
        this.handleSaveRlsInfo(inputEntity, userId);
        return inputEntity;
    }

    /**
     * 处理当前编辑-副本编辑
     *
     * @param inputEntity
     * @param userId
     */
    public void handleCurrentEditAndCopyEdit(Integer autoIncrementId, T inputEntity, Integer userId) {
        T currentEntityInDb = this.queryCurrentEntityInDbById(autoIncrementId);
        if (NewAddOrEditValidator.isCurrentEdit(currentEntityInDb.getCurrentVersion(), inputEntity.getCurrentVersion())) {
            //处理-当前编辑
            this.handleCurrentEdit(inputEntity, userId);
        } else {
            //处理-副本编辑
            this.handleCopyEdit(inputEntity, userId);
        }
    }

    /**
     * 查询当前数据数据
     *
     * @param autoIncrementId
     * @return
     */
    abstract public T queryCurrentEntityInDbById(Integer autoIncrementId);

    /**
     * 处理-关联信息的保存
     *
     * @param inputEntity
     * @param userId
     */
    abstract public void handleSaveRlsInfo(T inputEntity, Integer userId);

    /**
     * 历史版本初始化-如果没有初始版本
     *
     * @param autoIncrementId
     * @param userId
     */
    abstract public void handleInitHistoryVersionData(Integer autoIncrementId, Integer userId);


    /**
     * 处理-副本编辑
     *
     * @param inputEntity
     * @param userId
     */
    abstract public void handleCopyEdit(T inputEntity, Integer userId);

    /**
     * 处理-当前编辑
     *
     * @param inputEntity
     * @param userId
     */
    abstract public void handleCurrentEdit(T inputEntity, Integer userId);

    /**
     * 处理-创建副本
     *
     * @param inputEntity
     * @param userId
     */
    abstract public void handleCreateCopy(T inputEntity, Integer userId);

    /**
     * 处理-新增
     *
     * @param inputEntity
     * @param userId
     */
    abstract public void handleNewAdd(T inputEntity, Integer userId);


}
